package servlet;

import com.jspsmart.upload.File;
import com.jspsmart.upload.SmartUpload;
import com.jspsmart.upload.SmartUploadException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspFactory;
import javax.servlet.jsp.PageContext;
import java.io.IOException;

@WebServlet(urlPatterns = "/uploadtest")
public class UploadServlet  extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        try {
            //1.创建上传文件的对象
            SmartUpload smartUpload = new SmartUpload();

            //2.初始化上传操作
            //initialize的参数是一个PageContext类型内置对象，所以要在前面通过jsp工厂创建一个
            //getPageContext的参数分别表示：
            // 当前servlet对象  req  resp  请求JSP的错误页面的URL，不需要就写null  是否需要session  以字节为单位的缓冲区大小  缓冲区是否在缓冲区溢出时自动刷新到输出流，还是抛出IOException
            PageContext pageContext = JspFactory.getDefaultFactory()
                    .getPageContext(this, req, resp, null, false, 1024, true);
            smartUpload.initialize(pageContext);
            //2.1 设置编码   防止中文乱码
            smartUpload.setCharset("utf-8");
            //3.上传
            smartUpload.upload();      //上面的这些步骤就相当于是将上传来的文件 进行接收  放在一个上传文件 smartUpload对象里面

            //4.获取文件信息
            File file = smartUpload.getFiles().getFile(0);
            String fileName = file.getFileName();           //上传的文件名
            String contentType = file.getContentType();   //得到文件的类型

            //获取文本信息  接收除了文本格式的其他  传过来的数据   这些操作必须放在SmartUpload操作完成后
            String uname = smartUpload.getRequest().getParameter("uname");
            System.out.println("uname="+uname);     //比如这里输出的是哈哈哈
            String uname1 = req.getParameter("uname");
            System.out.println(uname1+"2222");    //这里输出的是 null2222    用这种形式在这里是获取不到的
            //5.指定上传的路径    将从客户端获取到的文件存放在指定位置  uploadfiles这个文件夹必须先前有保留到一个任意文件
            String uploadpath="/uploadfiles/"+fileName;
            //6.保存到指定位置
            file.saveAs(uploadpath,File.SAVEAS_VIRTUAL);   //第二个参数：表示当前文件要传入到虚拟路径下
            //7.跳转成功页面
            req.setAttribute("filename",fileName);
            req.getRequestDispatcher("success.jsp").forward(req,resp);
        } catch (SmartUploadException e) {
            e.printStackTrace();
        }


    }
}
